<?php
namespace Home\Controller;
use Think\Controller;
//header("content-type:text/html;charset=utf-8");编码格式

class ApiController extends Controller{
	public function index()
	{
		define("TOKEN", "wx2019");//define your token
		if($_GET['echostr']){
		  $wx = $this->valid();//如果发来了echostr则进行验证
		}else{
			$wx = $this->responseMsg();//如果没有echostr，则返回消息
		}

	}

	//接口配置信息验证
	public function valid(){
       $echoStr = $_GET["echostr"];
        if($this->checkSignature()){ //调用验证字段
            echo $echoStr;
            exit;
        }
    }
    //认证消息签名认证函数
    //验证字段
    private function checkSignature(){
 
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

	//消息管理
    public function responseMsg(){
       
        //1。获取到微信推送过来post数据(xml格式)
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
        

//换成switch进行判断
 		//2.将xml数据解析成数组格式
    //     $postobj = somplexml_load_string($postArr);
    //     //3.判断事件还是其他类型的消息
    //     switch(strtolower($postobj->MsgType)){
    //         //如果是订阅事件
    //         case 'subscribe':
    //             $content = '欢迎关注此公众号！！！\n更多精彩内容：欢迎咨询本人';
    //             $responseModel = new Response();
    //             $info = $responseModel -> response_text($postobj,$content);
    //             echo $info;
    //             break;
    //             //这里可以设置其他的事件类型
    //     }
    //     break;
    //     //如果传来文本数据的类型
		  // case 'text':
    //         if(trim($postobj->Content) == '图文' || trim(strtolower($postobj->Content)) == 'tuwen')
    //         {
    //             //这里发送一个图文消息
    //             $responseModel = new Response();
    //             $info = $responseModel->response_img_text($postobj);
    //             echo $info;
    //         }
    //         //这里可以有其他的if或者接入三方api
    //         break;



//不管是发送消息，还是事件的推送，我们统统在responseMsg()方法中实现，如果全部写在同一个方法中，会显得过于臃肿，所以建一个model专门处理回复消息
        //extract post data回复文本消息
        if(!empty($postStr)){
                
            //解析post来的XML为一个对象$postObj
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        
            $fromUsername = $postObj->FromUserName; //请求消息的用户
            $toUsername = $postObj->ToUserName; //"我"的公众号id
            $keyword = trim($postObj->Content); //消息内容
            $time = time(); //时间戳
            $msgtype = 'text'; //消息类型：文本
            $imagetype = 'image';
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>";
            $imageTpl = "<xml>
                          <ToUserName><![CDATA[%s]]></ToUserName>
                          <FromUserName><![CDATA[%s]]></FromUserName>
                          <CreateTime>%s</CreateTime>
                          <MsgType><![CDATA[%s]]></MsgType>
                          <Image>
                            <MediaId><![CDATA[%s]]></MediaId>
                          </Image>
                        </xml>";

        
            
            //接收消息的一个测试 存入log.txt文本中
            $data = date('Y-m-d H:i:s',$time)."
            客户的消息类型为: ".$postObj->MsgType.", 
			客户的openId: ".$fromUsername.", 
			我方公众号的openId: ".$toUsername.", 
			客户的消息内容：".$keyword."。\n";
			file_put_contents('log.txt', $data, FILE_APPEND);//FILE_APPEND追加不覆盖

 			//在新用户关注你的公众号时，自动返回信息：（把这段代码加在判断$keyword之前）。
            //菜单栏点击事件
            if($postObj->MsgType == 'event'){ //如果XML信息里消息类型为event
                if($postObj->Event == 'subscribe'){ //如果是订阅事件  关注自动回复消息
                    $contentStr = "欢迎关注此公众号！\n更多精彩内容：欢迎咨询本人";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                    echo $resultStr;
                    exit();
                }elseif ($postObj->Event == 'CLICK') {//点击事件推送类型大写
                	if($postObj->EventKey == 'zuixin'){
                        $contentStr = "最新消息\n更多精彩内容：欢迎咨询本人";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                        echo $resultStr;
                        exit();
                	}elseif($postObj->EventKey == 'lishi'){
                		$contentStr = "历史消息\n更多精彩内容：欢迎咨询本人";
	                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
	                    echo $resultStr;
	                    exit();
	                }
                } else{
	                echo "";
	            	exit;	
                }
            }


            //图片消息
            if($postObj->MsgType == 'image'){
                $url = $postObj->PicUrl;
                $MediaId = $postObj->MediaId;
                $contentStr = "你输入的是一张图片！\n地址：".$url."\nMediaid:".$MediaId;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }
            //语音消息
            if($postObj->MsgType == 'voice'){
                $Format = $postObj->Format;
                $MediaId = $postObj->MediaId;
                $contentStr = "你输入的是一段语音！\n格式：".$Format."\nMsgId:".$MediaId;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }
            //视频消息
            if($postObj->MsgType == 'video'){
                $ThumbMediaId = $postObj->ThumbMediaId;
                $MediaId = $postObj->MediaId;
                $contentStr = "你输入的是一段视频！\n视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据。".$ThumbMediaId."\nMsgId:".$MediaId;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }
            //小视频消息
            if($postObj->MsgType == 'shortvideo'){
                $ThumbMediaId = $postObj->ThumbMediaId;
                $MediaId = $postObj->MediaId;
                $contentStr = "你输入的是一段小视频！\n视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据。".$ThumbMediaId."\nMsgId:".$MediaId;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }
            //地理位置消息
            if($postObj->MsgType == 'location'){
                $Location_X = $postObj->Location_X;
                $Location_Y = $postObj->Location_Y;
                $Label = $postObj->Label;
                $contentStr = "你发送的地理位置！\n地理位置维度：".$Location_X."\n地理位置经度：".$Location_Y."\n地理位置信息:".$Label;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }
            //链接消息
            if($postObj->MsgType == 'link'){
                $Title = $postObj->Title;
                $Description = $postObj->Description;
                $Url = $postObj->Url;
                 $contentStr = "你发送的链接消息！\n消息标题：".$Title."\n消息描述：".$Description."\n消息链接：".$Url;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit(); 
            }



            //文本回复（关键词回复）
            if($keyword == '你好'){
                $contentStr = '您好！';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit();                                               
            }elseif($keyword == '好帅') {
            	$contentStr = '好帅啊！！！（都是假话别信-帅你个鬼）';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit();
            }elseif ($keyword == 'hello') {
           		$contentStr = 'hello word!!!';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
            } else{
                $contentStr = '你输入hello试试';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
                echo $resultStr;
                exit();
            }
 
        }else {
            echo "";
            exit;
        }
    }
     
}